package annotationTest.FieldAnno;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;

public class InitTool {

	/**
	 * 通过反射对注解元素进行初始化
	 * 这也是为什么Spring里面对于private注解的且没有setter的原因
	 * @param object
	 */
	
	public static void initFieldProxy(Object object)
	{
		Class clazz=object.getClass();
		initFieldProxy(object,clazz);
	}

	public static void initFieldProxy(Object object,Class clazz)
	{
		if(object==null||object.getClass()==null)
			return;

		Field[] fields=clazz.getDeclaredFields();
		if(fields==null)
		{
			initFieldProxy(object,clazz.getSuperclass());
			return;
		}

		for(Field field:fields)
		{
			FieldAnnotation anno=field.getAnnotation(FieldAnnotation.class);
			if(anno==null)
				continue;

			//下面这个设计非常精妙
			boolean accessible=field.isAccessible();


			field.setAccessible(true);
			try {
				field.set(object, anno.value());
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}



			field.setAccessible(accessible);
			//上面这个设计非常精妙
		}


	}
}
